home *** CD-ROM | disk | FTP | other *** search
- package javax.swing.tree;
-
- import java.awt.Rectangle;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Stack;
- import java.util.Vector;
- import javax.swing.event.TreeModelEvent;
-
- public class VariableHeightLayoutCache extends AbstractLayoutCache {
- private Vector visibleNodes = new Vector();
- private boolean updateNodeSizes;
- private TreeStateNode root;
- private Rectangle boundsBuffer = new Rectangle();
- private Hashtable treePathMapping = new Hashtable();
- private Stack tempStacks = new Stack();
-
- // $FF: synthetic method
- static void access$0(VariableHeightLayoutCache var0, TreeStateNode var1) {
- var0.addMapping(var1);
- }
-
- // $FF: synthetic method
- static Vector access$1(VariableHeightLayoutCache var0) {
- return var0.visibleNodes;
- }
-
- // $FF: synthetic method
- static TreeStateNode access$2(VariableHeightLayoutCache var0) {
- return var0.root;
- }
-
- // $FF: synthetic method
- static void access$3(VariableHeightLayoutCache var0, TreeStateNode var1) {
- var0.removeMapping(var1);
- }
-
- // $FF: synthetic method
- static Rectangle access$4(VariableHeightLayoutCache var0) {
- return var0.boundsBuffer;
- }
-
- // $FF: synthetic method
- static boolean access$5(VariableHeightLayoutCache var0) {
- return var0.updateNodeSizes;
- }
-
- // $FF: synthetic method
- static void access$6(VariableHeightLayoutCache var0, boolean var1) {
- var0.updateNodeSizes = var1;
- }
-
- // $FF: synthetic method
- static TreeStateNode access$7(VariableHeightLayoutCache var0, Object var1) {
- return var0.createNodeForValue(var1);
- }
-
- // $FF: synthetic method
- static void access$8(VariableHeightLayoutCache var0) {
- var0.visibleNodesChanged();
- }
-
- private void addMapping(TreeStateNode var1) {
- this.treePathMapping.put(var1.getTreePath(), var1);
- }
-
- private TreeStateNode createNodeAt(TreeStateNode var1, int var2) {
- Object var4 = super.treeModel.getChild(var1.getValue(), var2);
- TreeStateNode var5 = this.createNodeForValue(var4);
- ((DefaultMutableTreeNode)var1).insert(var5, var2);
- var5.updatePreferredSize(-1);
- boolean var3 = var1 == this.root;
- if (var5 != null && var1.isExpanded() && (var1.getRow() != -1 || var3)) {
- int var6;
- if (var2 == 0) {
- if (var3 && !((AbstractLayoutCache)this).isRootVisible()) {
- var6 = 0;
- } else {
- var6 = var1.getRow() + 1;
- }
- } else if (var2 == ((DefaultMutableTreeNode)var1).getChildCount()) {
- var6 = var1.getLastVisibleNode().getRow() + 1;
- } else {
- TreeStateNode var7 = (TreeStateNode)((DefaultMutableTreeNode)var1).getChildAt(var2 - 1);
- var6 = var7.getLastVisibleNode().getRow() + 1;
- }
-
- this.visibleNodes.insertElementAt(var5, var6);
- }
-
- return var5;
- }
-
- private TreeStateNode createNodeForValue(Object var1) {
- return new TreeStateNode(this, var1);
- }
-
- private void ensurePathIsExpanded(TreePath var1, boolean var2) {
- if (var1 != null) {
- if (super.treeModel.isLeaf(var1.getLastPathComponent())) {
- var1 = var1.getParentPath();
- var2 = true;
- }
-
- if (var1 != null) {
- TreeStateNode var3 = this.getNodeForPath(var1, false, true);
- if (var3 != null) {
- var3.makeVisible();
- if (var2) {
- var3.expand();
- }
- }
- }
- }
-
- }
-
- private Rectangle getBounds(int var1, Rectangle var2) {
- if (this.updateNodeSizes) {
- this.updateNodeSizes(false);
- }
-
- return var1 >= 0 && var1 < this.getRowCount() ? this.getNode(var1).getNodeBounds(var2) : null;
- }
-
- public Rectangle getBounds(TreePath var1, Rectangle var2) {
- TreeStateNode var3 = this.getNodeForPath(var1, true, false);
- if (var3 != null) {
- if (this.updateNodeSizes) {
- this.updateNodeSizes(false);
- }
-
- return var3.getNodeBounds(var2);
- } else {
- return null;
- }
- }
-
- public boolean getExpandedState(TreePath var1) {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- return var2 != null ? var2.isVisible() && var2.isExpanded() : false;
- }
-
- private TreeStateNode getMapping(TreePath var1) {
- return (TreeStateNode)this.treePathMapping.get(var1);
- }
-
- private int getMaxNodeWidth() {
- int var1 = 0;
-
- for(int var3 = this.getRowCount() - 1; var3 >= 0; --var3) {
- TreeStateNode var4 = this.getNode(var3);
- int var2 = var4.getPreferredWidth() + var4.getXOrigin();
- if (var2 > var1) {
- var1 = var2;
- }
- }
-
- return var1;
- }
-
- private TreeStateNode getNode(int var1) {
- return (TreeStateNode)this.visibleNodes.elementAt(var1);
- }
-
- private TreeStateNode getNodeForPath(TreePath var1, boolean var2, boolean var3) {
- if (var1 != null) {
- TreeStateNode var4 = this.getMapping(var1);
- if (var4 != null) {
- if (var2 && !var4.isVisible()) {
- return null;
- } else {
- return var4;
- }
- } else {
- Stack var5;
- if (this.tempStacks.size() == 0) {
- var5 = new Stack();
- } else {
- var5 = (Stack)this.tempStacks.pop();
- }
-
- try {
- var5.push(var1);
- var1 = var1.getParentPath();
-
- for(Object var14 = null; var1 != null; var1 = var1.getParentPath()) {
- var4 = this.getMapping(var1);
- if (var4 != null) {
- while(var4 != null && ((Vector)var5).size() > 0) {
- var1 = (TreePath)var5.pop();
- var4.getLoadedChildren(var3);
- int var9 = super.treeModel.getIndexOfChild(((DefaultMutableTreeNode)var4).getUserObject(), var1.getLastPathComponent());
- if (var9 != -1 && var9 < ((DefaultMutableTreeNode)var4).getChildCount() && (!var2 || var4.isVisible())) {
- var4 = (TreeStateNode)((DefaultMutableTreeNode)var4).getChildAt(var9);
- } else {
- var4 = null;
- }
- }
-
- TreeStateNode var6 = var4;
- return var6;
- }
-
- var5.push(var1);
- }
-
- return null;
- } finally {
- ((Vector)var5).removeAllElements();
- this.tempStacks.push(var5);
- }
- }
- } else {
- return null;
- }
- }
-
- public TreePath getPathClosestTo(int var1, int var2) {
- if (this.getRowCount() == 0) {
- return null;
- } else {
- if (this.updateNodeSizes) {
- this.updateNodeSizes(false);
- }
-
- int var3 = this.getRowContainingYLocation(var2);
- return this.getNode(var3).getTreePath();
- }
- }
-
- public TreePath getPathForRow(int var1) {
- return var1 >= 0 && var1 < this.getRowCount() ? this.getNode(var1).getTreePath() : null;
- }
-
- public int getPreferredWidth(Rectangle var1) {
- if (this.updateNodeSizes) {
- this.updateNodeSizes(false);
- }
-
- return this.getMaxNodeWidth();
- }
-
- private int getRowContainingYLocation(int var1) {
- if (((AbstractLayoutCache)this).isFixedRowHeight()) {
- return this.getRowCount() == 0 ? -1 : Math.max(0, Math.min(this.getRowCount() - 1, var1 / ((AbstractLayoutCache)this).getRowHeight()));
- } else {
- int var2;
- if ((var2 = this.getRowCount()) <= 0) {
- return -1;
- } else {
- int var5 = 0;
- int var4 = 0;
-
- while(var5 < var2) {
- var4 = (var2 - var5) / 2 + var5;
- TreeStateNode var7 = (TreeStateNode)this.visibleNodes.elementAt(var4);
- int var6 = var7.getYOrigin();
- int var3 = var6 + var7.getPreferredHeight();
- if (var1 < var6) {
- var2 = var4 - 1;
- } else {
- if (var1 < var3) {
- break;
- }
-
- var5 = var4 + 1;
- }
- }
-
- if (var5 == var2) {
- var4 = var5;
- if (var5 >= this.getRowCount()) {
- var4 = this.getRowCount() - 1;
- }
- }
-
- return var4;
- }
- }
- }
-
- public int getRowCount() {
- return this.visibleNodes.size();
- }
-
- public int getRowForPath(TreePath var1) {
- if (var1 == null) {
- return -1;
- } else {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- return var2 != null ? var2.getRow() : -1;
- }
- }
-
- public int getVisibleChildCount(TreePath var1) {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- return var2 != null ? var2.getVisibleChildCount() : 0;
- }
-
- public Enumeration getVisiblePathsFrom(TreePath var1) {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- return var2 != null ? new VisibleTreeStateNodeEnumeration(this, var2) : null;
- }
-
- public void invalidatePathBounds(TreePath var1) {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- if (var2 != null) {
- var2.markSizeInvalid();
- if (var2.isVisible()) {
- this.updateYLocationsFrom(var2.getRow());
- }
- }
-
- }
-
- public void invalidateSizes() {
- if (this.root != null) {
- this.root.deepMarkSizeInvalid();
- }
-
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && this.visibleNodes.size() > 0) {
- this.updateNodeSizes(true);
- }
-
- }
-
- public boolean isExpanded(TreePath var1) {
- if (var1 == null) {
- return false;
- } else {
- TreeStateNode var2 = this.getNodeForPath(var1, true, false);
- return var2 != null && var2.isExpanded();
- }
- }
-
- private void rebuild() {
- this.treePathMapping.clear();
- if (super.treeModel != null) {
- Object var1 = super.treeModel.getRoot();
- this.root = this.createNodeForValue(var1);
- this.root.path = new TreePath(var1);
- this.addMapping(this.root);
- this.root.updatePreferredSize(0);
- this.visibleNodes.removeAllElements();
- if (((AbstractLayoutCache)this).isRootVisible()) {
- this.visibleNodes.addElement(this.root);
- }
-
- if (!this.root.isExpanded()) {
- this.root.expand();
- } else {
- Enumeration var2 = this.root.children();
-
- while(var2.hasMoreElements()) {
- this.visibleNodes.addElement(var2.nextElement());
- }
-
- if (!((AbstractLayoutCache)this).isFixedRowHeight()) {
- this.updateYLocationsFrom(0);
- }
- }
- } else {
- this.visibleNodes.removeAllElements();
- this.root = null;
- }
-
- if (super.treeSelectionModel != null) {
- super.treeSelectionModel.clearSelection();
- }
-
- this.visibleNodesChanged();
- }
-
- private void removeMapping(TreeStateNode var1) {
- this.treePathMapping.remove(var1.getTreePath());
- }
-
- public void setExpandedState(TreePath var1, boolean var2) {
- if (var1 != null) {
- if (var2) {
- this.ensurePathIsExpanded(var1, true);
- } else {
- TreeStateNode var3 = this.getNodeForPath(var1, false, true);
- if (var3 != null) {
- var3.makeVisible();
- var3.collapse();
- }
- }
- }
-
- }
-
- public void setModel(TreeModel var1) {
- super.setModel(var1);
- this.rebuild();
- }
-
- public void setNodeDimensions(AbstractLayoutCache.NodeDimensions var1) {
- super.setNodeDimensions(var1);
- this.invalidateSizes();
- this.visibleNodesChanged();
- }
-
- public void setRootVisible(boolean var1) {
- if (((AbstractLayoutCache)this).isRootVisible() != var1 && this.root != null) {
- if (var1) {
- this.root.updatePreferredSize(0);
- this.visibleNodes.insertElementAt(this.root, 0);
- } else if (this.visibleNodes.size() > 0) {
- this.visibleNodes.removeElementAt(0);
- if (super.treeSelectionModel != null) {
- super.treeSelectionModel.removeSelectionPath(this.root.getTreePath());
- }
- }
-
- if (super.treeSelectionModel != null) {
- super.treeSelectionModel.resetRowSelection();
- }
-
- if (this.getRowCount() > 0) {
- this.getNode(0).setYOrigin(0);
- }
-
- this.updateYLocationsFrom(0);
- this.visibleNodesChanged();
- }
-
- super.setRootVisible(var1);
- }
-
- public void setRowHeight(int var1) {
- if (var1 != ((AbstractLayoutCache)this).getRowHeight()) {
- super.setRowHeight(var1);
- this.invalidateSizes();
- this.visibleNodesChanged();
- }
-
- }
-
- public void treeNodesChanged(TreeModelEvent var1) {
- if (var1 != null) {
- int[] var2 = var1.getChildIndices();
- TreeStateNode var3 = this.getNodeForPath(var1.getTreePath(), false, false);
- if (var3 != null) {
- Object var4 = var3.getValue();
- var3.updatePreferredSize();
- if (var3.hasBeenExpanded() && var2 != null) {
- for(int var5 = 0; var5 < var2.length; ++var5) {
- TreeStateNode var6 = (TreeStateNode)((DefaultMutableTreeNode)var3).getChildAt(var2[var5]);
- var6.setUserObject(super.treeModel.getChild(var4, var2[var5]));
- var6.updatePreferredSize();
- }
- } else if (var3 == this.root) {
- var3.updatePreferredSize();
- }
-
- if (!((AbstractLayoutCache)this).isFixedRowHeight()) {
- int var7 = var3.getRow();
- if (var7 != -1) {
- this.updateYLocationsFrom(var7);
- }
- }
-
- this.visibleNodesChanged();
- }
- }
-
- }
-
- public void treeNodesInserted(TreeModelEvent var1) {
- if (var1 != null) {
- int[] var2 = var1.getChildIndices();
- TreeStateNode var3 = this.getNodeForPath(var1.getTreePath(), false, false);
- if (var3 != null && var2 != null && var2.length > 0) {
- if (var3.hasBeenExpanded()) {
- int var8 = ((DefaultMutableTreeNode)var3).getChildCount();
- Object var6 = var3.getValue();
- boolean var4 = var3 == this.root && !super.rootVisible || var3.getRow() != -1 && var3.isExpanded();
-
- for(int var5 = 0; var5 < var2.length; ++var5) {
- this.createNodeAt(var3, var2[var5]);
- }
-
- if (var8 == 0) {
- var3.updatePreferredSize();
- }
-
- if (super.treeSelectionModel != null) {
- super.treeSelectionModel.resetRowSelection();
- }
-
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && (var4 || var8 == 0 && var3.isVisible())) {
- if (var3 == this.root) {
- this.updateYLocationsFrom(0);
- } else {
- this.updateYLocationsFrom(var3.getRow());
- }
-
- this.visibleNodesChanged();
- } else if (var4) {
- this.visibleNodesChanged();
- }
- } else if (super.treeModel.getChildCount(var3.getValue()) - var2.length == 0) {
- var3.updatePreferredSize();
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && var3.isVisible()) {
- this.updateYLocationsFrom(var3.getRow());
- }
- }
- }
- }
-
- }
-
- public void treeNodesRemoved(TreeModelEvent var1) {
- if (var1 != null) {
- int[] var2 = var1.getChildIndices();
- TreeStateNode var3 = this.getNodeForPath(var1.getTreePath(), false, false);
- if (var3 != null && var2 != null && var2.length > 0) {
- if (var3.hasBeenExpanded()) {
- boolean var4 = var3 == this.root && !super.rootVisible || var3.getRow() != -1 && var3.isExpanded();
-
- for(int var5 = var2.length - 1; var5 >= 0; --var5) {
- TreeStateNode var7 = (TreeStateNode)((DefaultMutableTreeNode)var3).getChildAt(var2[var5]);
- if (var7.isExpanded()) {
- var7.collapse(false);
- }
-
- if (var4) {
- int var6 = var7.getRow();
- if (var6 != -1) {
- this.visibleNodes.removeElementAt(var6);
- if (super.treeSelectionModel != null) {
- TreePath var8 = var7.getTreePath();
- super.treeSelectionModel.removeSelectionPath(var8);
- }
- }
- }
-
- var3.remove(var2[var5]);
- }
-
- if (((DefaultMutableTreeNode)var3).getChildCount() == 0) {
- var3.updatePreferredSize();
- }
-
- if (super.treeSelectionModel != null) {
- super.treeSelectionModel.resetRowSelection();
- }
-
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && (var4 || ((DefaultMutableTreeNode)var3).getChildCount() == 0 && var3.isVisible())) {
- if (var3 == this.root) {
- if (this.getRowCount() > 0) {
- this.getNode(0).setYOrigin(0);
- }
-
- this.updateYLocationsFrom(0);
- } else {
- this.updateYLocationsFrom(var3.getRow());
- }
-
- this.visibleNodesChanged();
- } else if (var4) {
- this.visibleNodesChanged();
- }
- } else if (super.treeModel.getChildCount(var3.getValue()) == 0) {
- var3.updatePreferredSize();
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && var3.isVisible()) {
- this.updateYLocationsFrom(var3.getRow());
- }
- }
- }
- }
-
- }
-
- public void treeStructureChanged(TreeModelEvent var1) {
- if (var1 != null) {
- TreePath var2 = var1.getTreePath();
- TreeStateNode var3 = this.getNodeForPath(var2, false, false);
- if (var3 == null && var2 != null && var2.getPathCount() == 1) {
- var3 = this.root;
- }
-
- if (var3 != null) {
- boolean var4 = var3.isExpanded();
- boolean var5 = var3.getRow() != -1;
- if (var3 == this.root) {
- this.rebuild();
- } else {
- TreeStateNode var10 = (TreeStateNode)((DefaultMutableTreeNode)var3).getParent();
- int var7 = ((DefaultMutableTreeNode)var10).getIndex(var3);
- if (var5 && var4) {
- var3.collapse(false);
- }
-
- if (var5) {
- this.visibleNodes.removeElement(var3);
- }
-
- ((DefaultMutableTreeNode)var3).removeFromParent();
- this.createNodeAt(var10, var7);
- TreeStateNode var9 = (TreeStateNode)((DefaultMutableTreeNode)var10).getChildAt(var7);
- if (var5 && var4) {
- var9.expand(false);
- }
-
- int var6 = var9.getRow();
- if (!((AbstractLayoutCache)this).isFixedRowHeight() && var5) {
- if (var6 == 0) {
- this.updateYLocationsFrom(var6);
- } else {
- this.updateYLocationsFrom(var6 - 1);
- }
-
- this.visibleNodesChanged();
- } else if (var5) {
- this.visibleNodesChanged();
- }
- }
- }
- }
-
- }
-
- private void updateNodeSizes(boolean var1) {
- this.updateNodeSizes = false;
- int var3 = 0;
- int var2 = 0;
-
- for(int var4 = this.visibleNodes.size(); var3 < var4; ++var3) {
- TreeStateNode var5 = (TreeStateNode)this.visibleNodes.elementAt(var3);
- var5.setYOrigin(var2);
- if (var1 || !var5.hasValidSize()) {
- var5.updatePreferredSize(var3);
- }
-
- var2 += var5.getPreferredHeight();
- }
-
- }
-
- private void updateYLocationsFrom(int var1) {
- if (var1 >= 0 && var1 < this.getRowCount()) {
- TreeStateNode var5 = this.getNode(var1);
- int var4 = var5.getYOrigin() + var5.getPreferredHeight();
- int var2 = var1 + 1;
-
- for(int var3 = this.visibleNodes.size(); var2 < var3; ++var2) {
- var5 = (TreeStateNode)this.visibleNodes.elementAt(var2);
- var5.setYOrigin(var4);
- var4 += var5.getPreferredHeight();
- }
- }
-
- }
-
- private void visibleNodesChanged() {
- }
- }
-